#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>


using namespace std;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int tickets = 100;
// void* start_routine(void* args)
// {
//     string name = static_cast<const char*>(args);
//     while(true)
//     {
//         pthread_mutex_lock(&mutex);//加锁
//         pthread_cond_wait(&cond,&mutex);//等待条件
        
//         cout<< name << " -> " <<" 我是线程A "<< tickets-- << endl;
//         pthread_cond_signal(&cond);
//         pthread_mutex_unlock(&mutex);//解锁
//         sleep(1);
//     }
// }
// void* thread_routine(void* args)
// {
//     string name = static_cast<const char*>(args);
//     while(true)
//     {
//         pthread_mutex_lock(&mutex);//加锁
//         pthread_cond_wait(&cond,&mutex);//等待条件
//         cout<< name << " -> " <<" 我是线程B "<< tickets-- << endl;
//         pthread_cond_signal(&cond);
//         pthread_mutex_unlock(&mutex);//解锁
//         sleep(1);
//     }
// }
int flag = 0;
void* start_routine(void* args)
{
    string name = static_cast<const char*>(args);
    while(true)
    {
        pthread_mutex_lock(&mutex);//加锁
        if(flag == 1)
            pthread_cond_wait(&cond,&mutex);//等待条件

        cout<< name << " -> " <<" 我是线程A "<< endl;
        flag++;
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);//解锁
        sleep(1);
    }
}
void* thread_routine(void* args)
{
    string name = static_cast<const char*>(args);
    while(true)
    {
        pthread_mutex_lock(&mutex);//加锁
        if(flag == 0)
            pthread_cond_wait(&cond,&mutex);//等待条件
        flag--;
        cout<< name << " -> " <<" 我是线程B "<< endl;
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);//解锁
        sleep(1);
    }
}
int main()
{
    pthread_t t1,t2;
    pthread_create(&t2,nullptr,thread_routine,(void*)"thread 2");
    pthread_create(&t1,nullptr,start_routine,(void*)"thread 1");

    // while(true)
    // {
    //     sleep(1);
    //     // pthread_cond_signal(&cond); //唤醒条件队列中的一个线程
    //     pthread_cond_broadcast(&cond);  //唤醒条件队列中的所有线程
    //     cout<<"线程已唤醒 " << endl;
    // }

    pthread_join(t1,nullptr);
    pthread_join(t2,nullptr);

    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);
    return 0;
}